/**
 * ************************************************************************
 *
 * @file    buttonConfig.c
 * @brief   flexible_button配置
 * @author  负号科技(fuhaokj@foxmail.com)
 * @version 0.1
 * @date    2023-09-21
 *
 * ************************************************************************
 *   __       _                 _    _
 *  / _|     | |               | |  (_)
 * | |_ _   _| |__   __ _  ___ | | ___
 * |  _| | | | '_ \ / _` |/ _ \| |/ / |
 * | | | |_| | | | | (_| | (_) |   <| |
 * |_|  \__,_|_| |_|\__,_|\___/|_|\_\ |
 *                                 _/ |
 *                                |__/
 *
 * @copyright Copyright (c) 2023 负号科技
 * For study and research only, no reprinting
 * ************************************************************************
 */
#include "buttonConfig.h"
#include <string.h>
#include "app.h"

/*定义按键*/
typedef enum
{
    K_SW2 = 0,
    K_SW3,
    K_SW4,
    USER_BUTTON_MAX
} user_button_t;

static flex_button_t user_button[USER_BUTTON_MAX];

uint8_t keyn = 0;
/**
 * @brief   按键初始化
 * @date    2023-09-21
 *
 */
void user_button_init(void)
{
    int i;
    memset(&user_button[0], 0x0, sizeof(user_button));

    for (i = 0; i < USER_BUTTON_MAX; i++)
    {
        user_button[i].id = i;                            // 按键的ID号
        user_button[i].usr_button_read = common_btn_read; // 按键引脚电平读取函数
        user_button[i].cb = common_btn_evt_cb;            // 事件回调函数
        if (i == 0)
        {
            user_button[i].pressed_logic_level = 0; // 设置按键按下的逻辑电平
        }
        else
            user_button[i].pressed_logic_level = 0; // 设置按键按下的逻辑电平

        user_button[i].short_press_start_tick = FLEX_MS_TO_SCAN_CNT(500); // 设置短按事件触发的起始 tick
        user_button[i].long_press_start_tick = FLEX_MS_TO_SCAN_CNT(2000); // 设置长按事件触发的起始 tick
        user_button[i].long_hold_start_tick = FLEX_MS_TO_SCAN_CNT(3500);  // 设置长按保持事件触发的起始 tick

        flex_button_register(&user_button[i]); // 按键注册
    }
}

/**
 * @brief   按键引脚电平读取
 * @param   arg         参数描述
 * @return  uint8_t
 * @date    2023-09-21
 *
 */
static uint8_t common_btn_read(void *arg)
{
    uint8_t value = 0;

    flex_button_t *btn = (flex_button_t *)arg;

    switch (btn->id)
    {
    case K_SW2:
        value = PAin(0);
        break;

    case K_SW3:
        value = PCin(8);
        break;

    case K_SW4:
        value = PCin(9);
        break;

    default:

        break;
    }

    return value;
}

/**
 * @brief   按键事件回调函数
 * @param   arg         参数描述
 * @date    2023-09-21
 *				FLEX_BTN_PRESS_DOWN = 0,					按下事件
 *				FLEX_BTN_PRESS_CLICK,							单击事件
 *				FLEX_BTN_PRESS_DOUBLE_CLICK,			双击事件
 *				FLEX_BTN_PRESS_REPEAT_CLICK,			连击事件，使用 flex_button_t 中的 click_cnt 断定连击次
 *				FLEX_BTN_PRESS_SHORT_START,				短按开始事件
 *				FLEX_BTN_PRESS_SHORT_UP,					短按抬起事件
 *				FLEX_BTN_PRESS_LONG_START,				长按开始事件
 *				FLEX_BTN_PRESS_LONG_UP,						长按抬起事件
 *				FLEX_BTN_PRESS_LONG_HOLD,					长按保持事件
 *				FLEX_BTN_PRESS_LONG_HOLD_UP,			长按保持的抬起事件
 *				FLEX_BTN_PRESS_MAX,
 *				FLEX_BTN_PRESS_NONE,
 */
static void common_btn_evt_cb(void *arg)
{
    flex_button_t *btn = (flex_button_t *)arg;

    // 非组合按键事件处理
    non_combination_btn_event(btn);

    // 组合按键事件处理
    if ((flex_button_event_read(&user_button[K_SW2]) == FLEX_BTN_PRESS_CLICK) &&
        (flex_button_event_read(&user_button[K_SW3]) == FLEX_BTN_PRESS_CLICK))
    {
    }
}

/**
 * @brief   非组合按键事件处理
 * @param   btn         参数描述
 * @date    2023-09-21
 *
 */
static void non_combination_btn_event(flex_button_t *btn)
{
    switch (btn->id)
    {
    case K_SW2:
    {
        switch (btn->event)
        {
        /*按下事件*/
        case FLEX_BTN_PRESS_DOWN:

            break;

        /*单击事件*/
        case FLEX_BTN_PRESS_CLICK:
            // keyn=2;

            break;

        /*双击事件*/
        case FLEX_BTN_PRESS_DOUBLE_CLICK:

            break;

        /*长按保持事件*/
        case FLEX_BTN_PRESS_LONG_HOLD:

            break;

        default:
            break;
        }

        break;
    }

    case K_SW3:
    {
        switch (btn->event)
        {
        /*按下事件*/
        case FLEX_BTN_PRESS_DOWN:

            break;

        /*单击事件*/
        case FLEX_BTN_PRESS_CLICK:
            keyn = 3;

            break;

        /*双击事件*/
        case FLEX_BTN_PRESS_DOUBLE_CLICK:

            break;

        /*长按保持事件*/
        case FLEX_BTN_PRESS_LONG_HOLD:

            break;

        default:
            break;
        }

        break;
    }

    case K_SW4:
    {
        switch (btn->event)
        {
        /*按下事件*/
        case FLEX_BTN_PRESS_DOWN:

            break;

        /*单击事件*/
        case FLEX_BTN_PRESS_CLICK:
            keyn = 4;
            OTA_UPDATE();
            break;

        /*双击事件*/
        case FLEX_BTN_PRESS_DOUBLE_CLICK:

            break;

        /*长按保持事件*/
        case FLEX_BTN_PRESS_LONG_HOLD:

            break;

        default:
            break;
        }

        break;
    }

    default:
        break;
    }
}
